let cacheList = {};

//  获取缓存记录列表
export function getCacheList() {
  cacheList = wx.getStorageSync("cacheList") || cacheList;
  // console.log(cacheList);
  return cacheList;
}

// 记录一条数据到缓存记录列表中
export function setCacheList(key, value) {
  const cacheList = getCacheList();
  cacheList[key] = value;
  wx.setStorageSync("cacheList", cacheList);
}

// 从缓存记录列表中移除一条记录
export function removeFromCacheList(key) {
  const cacheList = getCacheList();
  delete cacheList[key];
  wx.setStorageSync("cacheList", cacheList);
}

// 移除一条缓存
export function removeCache(key) {
  // 从缓存中删除对应的数据
  wx.removeStorageSync(key);

  // 从记录缓存的列表中移除这条记录
  removeFromCacheList(key);
}

// 清除所有的缓存
export function clearCache() {
  Object.keys(getCacheList()).forEach((key) => removeCache(key));
}

// 清除所有过期的缓存
export function clearExpiredCache() {
  // [[key, value], ]
  Object.entries(getCacheList()).forEach(([key, expired]) => {
    if (expired <= Date.now()) {
      removeCache(key);
    }
  });
}

//  导出的缓存函数，可以对其它函数的结果进行缓存
//  参数 key： 缓存的key名
//    callback： 要缓存结果的函数
//    expiredInterval： 缓存过期间隔
export default function (key, callback, expiredInterval = 24 * 3600 * 1000) {
  // 返回一个新的函数
  return async function () {
    // 首先从缓存中看看有没有对应的缓存数据，如果有就返回
    let { data, expired } = wx.getStorageSync(key);
    if (data && expired > Date.now()) {
      return data;
    }

    // 如果没有缓存数据（过期），就调用回调函数
    data = callback && (await callback());

    if (data) {
      // 把回调函数返回值存入缓存
      wx.setStorageSync(key, { data, expired: Date.now() + expiredInterval });

      // 记录此条缓存的信息到cachList里面
      setCacheList(key, Date.now() + expiredInterval);
      return data;
    }
  };
}
